package com.itheima.exerciseTest.test50_59;

import java.io.File;
import java.util.HashMap;
import java.util.Scanner;

/*
    1、完成以下需求!需求中应尽可能包含File类的
	a.在D盘下创建一个 cs_heima 文件夹
	b.键盘录入一个路径判断该路径是否存在
	c.键盘录入一个路径，并将该路径指向的文件或文件夹删除；(别瞎玩)
	d.获得指定文件夹下所有的java文件(不考虑子文件夹的)并输出到控制台
	e.统计任意一个文件夹的大小
 */
public class Test52 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // a.在D盘下创建一个 cs_heima 文件夹
        File file = new File("backBurner\\c");
        file.mkdirs();

        // b.键盘录入一个路径判断该路径是否存在
        System.out.println("请输入要查询的地址值：");
        String str = sc.nextLine().trim();
        file = new File(str);
        boolean exists = file.exists();
        if (!exists)
            System.out.println("文件不存在");
        System.out.println("文件存在");

        //c.键盘录入一个路径，并将该路径指向的文件或文件夹删除；(别瞎玩)
        System.out.println("请输入要删除的文件或文件夹的地址值：");
        str = sc.nextLine().trim();
        file = new File(str);

        if (!file.exists()) {
            System.out.println("文件不存在");
        } else if (file.isFile()) {
            file.delete();
            System.out.println("文件删除成功");
        } else {
            deleteFile(file);
            System.out.println("文件夹删除成功");
        }

        // d.获得指定文件夹下所有的java文件(不考虑子文件夹的)并输出到控制台
        System.out.println("请输入要查找的文件夹");
        str = sc.nextLine().trim();
        file = new File(str);
        if (!file.exists()) {
            System.out.println("地址不存在");
        } else if (!file.isDirectory()) {
            System.out.println("该地址不是文件夹");
        } else {
            HashMap<String, Integer> hm = countFiles(file);
            System.out.println(hm);
        }

        // e.统计任意一个文件夹的大小
        System.out.println("请输入要查询大小的文件夹地址：");
        str = sc.nextLine().trim();
        file = new File(str);
        if (!file.exists()) {
            System.out.println("该地址不存在");
        } else if (file.isFile()) {
            long fileLength = getFileLength(file);
            System.out.println(file.getName() + "该文件的大小为：" + fileLength + "字节");
        } else {
            long directoryLength = getDirectoryLength(file);
            System.out.println(file.getName() + "该文件夹的大小为：" + directoryLength + "字节");
        }

    }

    // 删除指定文件夹
    public static void deleteFile(File file) {
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile()) {
                f.delete();
            } else {
                deleteFile(f);
            }
        }
        file.delete();
    }

    // 查询指定文件夹入口
    public static HashMap<String, Integer> countFiles(File file) {
        HashMap<String, Integer> hm = new HashMap<>();
        countFiles(file, hm);
        return hm;
    }

    // 查询指定文件夹核心逻辑
    public static void countFiles(File file, HashMap<String, Integer> hm) {
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile()) {
                String fileName = f.getName();
                String[] split = fileName.split("\\.");
                String fileEndName = split[split.length - 1];
                if (hm.containsKey(fileEndName)) {
                    Integer count = hm.get(fileEndName);
                    count++;
                    hm.put(fileEndName, count);
                } else {
                    hm.put(fileEndName, 1);
                }

            } else {
                countFiles(f, hm);
            }
        }
    }

    // 查询文件的大小
    public static long getFileLength(File file) {
        long fileLength = file.length();
        return fileLength;
    }

    // 查看文件夹的大小入口
    public static long getDirectoryLength(File file) {
        long directoryLength = 0L;
        directoryLength = getDirectoryLength(file, directoryLength);
        return directoryLength;
    }

    // 查看文件夹的大小核心代码
    public static long getDirectoryLength(File file, long directoryLength) {
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile()) {
                directoryLength += f.length();
            } else {
                directoryLength += getDirectoryLength(f, directoryLength);
            }
        }
        return directoryLength;
    }

}
